/**
 * @(#)KalenderMapper.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.db;

import java.sql.*;
import java.rmi.RemoteException;
import de.hdm.gruppenkalender.team04.data.Kalender;
import de.hdm.gruppenkalender.team04.data.KalenderImpl;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.F738A0AC-BC0A-A58B-2B4F-A5D3DB1CC8AD]
// </editor-fold>
/**
 * Mapper-Klasse, die {@link Kalender}-Objekte auf eine relationale
 * Datenbank abbildet.
 * <p>
 * Hierzu wird eine Reihe von Methoden zur Verfügung gestellt, mit deren Hilfe
 * z.B. Objekte gesucht, erzeugt, modifiziert und gelöscht werden können.
 * <p>
 * In Anlehung an:
 * de.hdm.thies.bankprojekt.db.AccountMapper
 *
 * @author Prof. Dr. Peter Thies
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class KalenderMapper {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.794B4D81-7EF3-AAF9-9EF1-A8997C7CA740]
    // </editor-fold>
    /**
     * Die Klasse KalenderMapper wird nur einmal instantiiert. Man spricht hierbei
     * von einem sogenannten <b>Singleton</b>.
     * <p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see #kalenderMapper() 
     */
    private static KalenderMapper kalenderMapper;

    /**
     * Geschützter Konstruktor - verhindert die Möglichkeit, mit new neue
     * Instanzen dieser Klasse zu erzeugen.
     */
    protected KalenderMapper() {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D23A75A2-0BCC-49F4-35D6-8330979AEA6A]
    // </editor-fold>
    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>KalenderMapper.kalenderMapper()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>KalenderMapper</code> existiert.
     *
     * @return {@link KalenderMapper}-Objekt.
     * @see #kalenderMapper
     */
    public static KalenderMapper kalenderMapper() {
        if (kalenderMapper == null) {
            kalenderMapper = new KalenderMapper();
        }

        return kalenderMapper;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.36C359C9-88D0-1195-806F-ECADAE703D19]
    // </editor-fold>
    /**
     * Gibt ein Objekt mit übergegebener Id zurück.
     *
     * @param   id
     * @return  Kalender    {@link Kalender}-Objekt, oder null wenn keines gefunden wurde.
     */
    public Kalender findeViaSchluessel(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT kalenderId, bezeichnung FROM kalender " +
                    " WHERE kalenderId =" + id + ";");

            // Prüfen, ob ein Ergebnis vorliegt.
            if (rs.next()) {
                // Umwandlung in ein {@link Kalender}-Objekt.
                Kalender k = new KalenderImpl();
                k.setKalenderId(rs.getInt("kalenderId"));
                k.setBezeichnung(rs.getString("bezeichnung"));
                con.close();
                System.out.println(KalenderMapper.class.getName() +
                        " - findeViaSchluessel ausgeführt.");
                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.C6E05676-CDAA-2D09-65A9-5515E629AC7A]
    // </editor-fold>
    /**
     * Auslesen aller {@link Kalender}-Objekten.
     *
     * @return  Vector<Kalender>    Ein {@link Vector} mit {@link Kalender}-Objekten.
     */
    public Vector<Kalender> findeAlle() {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        Vector<Kalender> result = new Vector<Kalender>();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT kalenderId, bezeichnung, besitzer FROM kalender " +
                    " ORDER BY kalenderId");

            /**
             * Für jeden Eintrag im Suchergebnis wird nun
             * ein {@link Kalender}-Objekt erstellt.
             */
            while (rs.next()) {
                Kalender k = new KalenderImpl();
                k.setKalenderId(rs.getInt("kalenderId"));
                k.setBezeichnung(rs.getString("bezeichnung"));
                k.setBesitzerId(rs.getInt("besitzer"));
                result.addElement(k);
            }
            System.out.println(KalenderMapper.class.getName() +
                    " - findeAlle ausgeführt.");
        } catch (RemoteException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return result;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0E01DFEB-74DE-0335-8E5A-7AF08C6BD455]
    // </editor-fold>
    /**
     * Einfügen eines {@link Kalender}-Objekts in die Datenbank.
     *
     * @param   k   das zu speichernde Objekt
     * @return  das gespeicherte Objekt.
     */
    public Kalender einfuegen(Kalender k) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Aktuell größte Id in der Datenbak wird abgerufen.
            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(kalenderId) AS maxid " +
                    "FROM kalender");
            if (rs.next()) {
                k.setKalenderId(rs.getInt("maxid") + 1);

                // Statement ausfüllen und als Query an die DB schicken
                stmt.executeUpdate(
                        "INSERT INTO kalender (kalenderId, bezeichnung, besitzer) " +
                        "VALUES ('" +
                        k.getKalenderId() + "','" +
                        k.getBezeichnung() + "','" +
                        k.getBesitzerId() + "');");
                con.close();
                System.out.println(KalenderMapper.class.getName() +
                        " - einfuegen ausgeführt.");
                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.CF702ED5-7BF6-08B8-179F-5C779137A818]
    // </editor-fold>
    /**
     * Wiederholtes Schreiben eines Objekts in die Datenbank.
     *
     * @param   k   das Objekt, das in die DB geschrieben werden soll
     * @return  das als Parameter übergebene Objekt
     */
    public Kalender aktualisieren(Kalender k) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate("UPDATE kalender " +
                    "SET bezeichnung='" + k.getBezeichnung() + "', " +
                    "besitzer='" + k.getBesitzerId() + "' " +
                    "WHERE kalenderId='" + k.getKalenderId() + "'");

            System.out.println(KalenderMapper.class.getName() +
                    " - aktualisieren ausgeführt.");
            return k;
        } catch (RemoteException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4E53CA3F-DAC7-4A55-FB69-529653B92159]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Kalender}-Objekts aus der Datenbank.
     *
     * @param   id  des aus der DB zu löschenden "Objekts".
     */
    public void loeschen(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate("DELETE FROM kalender " +
                    "WHERE kalenderId=" + id);

            System.out.println(KalenderMapper.class.getName() +
                    " - loeschen ausgeführt.");
        } catch (SQLException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.273B4EE3-AFCE-A08E-0858-9CB6C4650A6E]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Kalender}-Objekts aus der Datenbank.
     *
     * @param   k  das aus der DB zu löschende "Objekt".
     */
    public void loeschen(Kalender k) {
        try {
            this.loeschen(k.getKalenderId());
        } catch (RemoteException ex) {
            Logger.getLogger(KalenderMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }
}
